若要長期穩定的使用服務,了解其安全性是必要的。畢竟世上沒有 100% 安全的軟硬體,總是會存在一些漏洞在往後被有心人士給發現。一般而言,Docker 被認為安全的第一直覺是因為每個容器會有一個「隔離」的環境。
Docker 的容器環境能夠實現「隔離」,主要是仰賴於 Linux 所提供的 Namespace 機制來實現。不過容器間以及容器與宿主間的隔離,其實並沒想像中的徹底。例如當你要在容器內進行一些指令操作,這還是得仰賴於 Host Linux 系統中的 /sys 來獲取相關訊息。簡言之,當你在 docker 容器中修改了這些沒被 Namespace 區隔的目錄和模組,會同步修改到 Host Linux 的內容。
容器內的環境,會是「輕量化且受到不小限制」的。因為其背後的實作,部分會需要 Host 的 root 權限。若這個 root 權限遭到濫用,那就失去了「隔離且不影響 Host」的意義。在預設情況下, docker 是關閉以下內容的:
Docker 利用 CGroups 機制來實現對每個容器中關於 CPU、記憶體...等的限制。舉例來說,以下指令代表啟用一個 Ubuntu 最新版本的容器,限制其 CPU 為 2、記憶體為 200Mb
docker run -it --cpus="2" --memory="200m" ubuntu:latest /bin/bash
Docker 由映像檔建立一個容器,必定需要利用 root 權限啟用 daemon。如果駭客已能存取你的 Host 主機,那這些操作就不是難事。不過在 Host 主機能進行的操作更多,就無強烈使用容器的完成攻擊動作指令必要性。因此,利用 docker daemon 所開放的 port ( 預設為 2375,且無須認證 ) 的 API 來進行攻擊變成了一種可行的方式。因應之道為「在使用 API 來對 docker 進行操作之前,先行綁定一組 TLS 證書」
使用精簡版的 Image
使用越為精簡的 Image 來生成容器或是打造自己的映像檔,都會使安全性提升許多。由 Snyk 所提供的報告指出,採用精簡版本的 node,都可以讓漏洞有效的下降不少。
保持最小權限原則
容器內的權限,預設都是用 root 啟動的。如果你想要避免這個情況,可以視情況加入較小權限的 User。